package thread;

/**
 * 如果一个静态方法使用synchronized后,那么该方法一定具有同步效果.多个线程一定分开执行
 */
public class SyncDemo3 {
    public static void main(String[] args) {
//        Thread t1 = new Thread(new Runnable() {
//            public void run() {
//                Boo.doSome();
//            }
//        });

//        Thread t1 = new Thread(()->Boo.doSome());

//        Thread t1 = new Thread(Boo::doSome);
//        Thread t2 = new Thread(Boo::doSome);

        Boo b1 = new Boo();
        Boo b2 = new Boo();
        //实际开发中不应用:对象.静态方法()  这样做的语义是不明确的
        Thread t1 = new Thread(()->b1.doSome());
        Thread t2 = new Thread(()->b2.doSome());
        t1.start();
        t2.start();
    }
}

class Boo{
    /*
        静态方法上使用synchronized,同步监视器对象不可选,使用的是当前类的类对象
        Class的实例
        在JVM中每个类都只有一个类对象,因此静态方法指定类对象可做到一定具有同步效果
        类对象的知识会在后面学习反射时解释.
     */
//    public synchronized static void doSome(){
    public static void doSome(){
        synchronized (Boo.class) {//类对象指定格式:类名.class
            Thread t = Thread.currentThread();
            System.out.println(t.getName() + ":正在执行doSome方法...");
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(t.getName() + ":执行doSome方法完毕!");
        }
    }
}




